#pragma once

#include <string>
#include <memory>
#include <optional>
#include <nlohmann/json.hpp>

namespace storage {


struct UserEntity {
    int64_t id;
    std::string username;
    std::string password_hash;

    // 可选字段
    //std::string email;
    // int account_status;

    // 创建时间 从数据库获取 (业务层不需要访问)
    // std::chrono::system_clock::time_point created_at;
    // 更新时间 从数据库获取 (业务层不需要访问)
    // std::chrono::system_clock::time_point updated_at;
    
    // 不需要持久化,由redis管理
    bool is_online;
};

struct UserSession {
    std::string username;
    std::string session_token;
    // 过期时间
    // std::chrono::system_clock::time_point expires_at;
};

class IUserStorage {
public:
    virtual ~IUserStorage() = default;
    
    virtual bool create_user(const UserEntity& user) = 0;
    virtual std::optional<UserEntity> get_user_by_username(const std::string& username) = 0;
    virtual std::optional<UserEntity> get_user_by_id(int64_t user_id) = 0;
    virtual bool update_user(const UserEntity& user) = 0;
    virtual bool delete_user(int64_t user_id) = 0;
    virtual bool exists_by_username(const std::string& username) = 0;

    // 会话相关
    virtual bool store_session(const UserSession& session) = 0;
    virtual bool delete_session(const std::string& username) = 0;
    virtual std::optional<UserSession> get_session(const std::string& username) = 0;

};

// class UserStorage {
// public:
//     explicit UserStorage();
//     ~UserStorage() = default;

// private:
//     std::shared_ptr<MysqlStorage> mysql_storage_;
//     std::shared_ptr<RedisStorage> redis_storage_;

//     // 用户相关操作
//     bool create_user(const nlohmann::json& user_data) { return mysql_storage_->create_user(user_data); }
//     nlohmann::json get_user(const std::string& user_id) { return mysql_storage_->get_user(user_id); }
//     bool update_user(const std::string& user_id, const nlohmann::json& user_data) { return mysql_storage_->update_user(user_id, user_data); }
//     bool delete_user(const std::string& user_id) { return mysql_storage_->delete_user(user_id); }

//     // 会话管理
//     // bool create_session(const std::string& user_id, const std::string& session_token) { return redis_storage_->create_session(user_id, session_token); }
//     // bool validate_session(const std::string& session_token) { return redis_storage_->validate_session(session_token); }
//     // bool delete_session(const std::string& session_token) { return redis_storage_->delete_session(session_token); }
// };

}